package csomag.telefonregiszter.dao;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;

import csomag.telefonregiszter.hibernate.Hibernate;

public class DAO {
	private Hibernate hibernate;
	
	public DAO(Hibernate hibernate) {
		this.hibernate = hibernate;
	}
	
	/*
	 * Az adatbázisba mentés végezhető el ezzel a metódussal.
	 */
	public void objektumMentes(Object o){
		Session s = hibernate.getSessionFactory().openSession();
		s.beginTransaction();
		
		s.save(o);
		
		s.getTransaction().commit();
		s.close();
	}
	
	/*
	 * ID alapján kikereshető egy adott típusú entitás.
	 */
	public <T> T objektumKeresIdAlapjan(Class<T> tipus, int id){
		Session s = hibernate.getSessionFactory().openSession();
		s.beginTransaction();
		
		@SuppressWarnings("unchecked")
		T eredmeny = (T) s.get(tipus, id);
		
		s.getTransaction().commit();
		s.close();
		
		return eredmeny;
	}
	
	/*
	 * Adott típusú és ID-jú elemet töröl az adatbázisból.
	 */
	public <T> void objektumTorlesIdAlapjan(Class<T> tipus, int id){
		Session s = hibernate.getSessionFactory().openSession();
		s.beginTransaction();
		
		@SuppressWarnings("unchecked")
		T eredmeny = (T) s.get(tipus, id);
		s.delete(eredmeny);
		
		s.getTransaction().commit();
		s.close();
	}
	
	/*
	 * Adott mezőnév és érték alapján keres az adatbázisban típus alapján.
	 * Egy listát ad vissza eredményül.
	 */
	public <T> List<T> objektumKeresesNevErtekAlapjan(Class<T> tipus, String mezoNeve, Object mezoErteke){
		Session s = hibernate.getSessionFactory().openSession();
		s.beginTransaction();
		
		Criteria criteria = s.createCriteria(tipus);
		criteria.add(Restrictions.eq(mezoNeve, mezoErteke));
		
		@SuppressWarnings("unchecked")
		List<T> eredmeny = criteria.list();
		
		s.getTransaction().commit();
		s.close();
		
		return eredmeny;
	}

	public Hibernate getHibernate() {
		return hibernate;
	}
}